
系列:30 天打造企業級 PLM|面向:全端
圖面、規格書、檢驗報告,PLM 一半的價值在檔案上。但掛檔案遠不只是上傳:檔案要跟著料號版本走(A 版的圖不能跟 B 版的混)、要有自己的版本(同一份規格書改了三稿)、下載要有權限(Day 6 的教訓),還要能接住舊系統搬來的幾 TB 附件。今天把檔案子系統一次講完。
ItemRevision 上而不是 Item 上,Day 3 模型的延伸:需要歷史的東西掛版本在以前 Oracle Agile PLM 中,檔案子系統是一套獨立且脆弱的架構:
File Manager ticket invalid,導致全公司無法下載圖面;Mini-PLM 採用儲存來源抽象化(Storage Provider)架構,底層支援 Local、S3 與外部唯讀 Vault,直接以標準 REST 串流下載,完全摒棄複雜的中介 Ticket 協定:
看實際的 mp_filedata 關鍵欄位:
mp_filedata
file_name varchar(256)
storage_uuid varchar(45) ← 實體檔名(UUID,防猜測、防重名)
storage_folder varchar(10) ← 分散目錄(避免單目錄百萬檔案)
storage_source varchar(20) DEFAULT 'LOCAL' ← 儲存來源:LOCAL / 外部 vault
source_system varchar(30) ─┐
source_file_id varchar(100) ├─ 外部來源的對應資訊(原系統檔案 ID、
source_vault_id varchar(100) ─┘ 所屬 vault——支援多廠區多檔案庫)
storage_source 是整個設計的樞紐。讀取端走 provider 介面,LOCAL 讀本地上傳目錄;外部 vault provider 依 source_file_id 換算出舊檔案庫的實體路徑(ID 補位、分層目錄規則,Day 24 附件對應鏈的執行版)唯讀取用。上層的下載 API、預覽、權限檢查完全不知道檔案實際住哪,新舊兩個世界在同一個下載連結後面無縫並存。
配套的安全規則:外部來源標記 SOURCE_READ_ONLY。在 Mini-PLM 刪除這筆附件,只移除關聯,永不動舊檔案庫的實體檔。那是舊系統的資產,新系統只是借閱者。
單檔掛附件之外,還有資料夾等級的需求:一包相關文件(規格書、測試報告、DFM 回饋)要一起改版。File Folder 三層模型:
mp_file_folder(資料夾)→ mp_file_folder_version(版本)→ mp_file_folder_file(版本內的檔案清單)
版本語意與 Item Revision 同款(Day 13 的思路複用):發行過的資料夾版本不可變,改內容就開新版本;mp_file_folder_binding 把資料夾綁到業務物件(表單、品項)。同一套不可變版本的心法,這已經是第三次落地了:Item、Redline、File Folder。好的模型會自己長腳。
Day 6 預告過的完整版。uuid 下載端點的演進分三階段。
階段 0 是原罪:匿名可下載,「知道連結就能拿」的內網習慣思維,storage_uuid 不可猜是唯一防線。階段 1:全面 authenticated(),離職員工的連結失效了,但任何登入者仍可下載任何檔案。階段 2(進行中):檔案級授權,owner、sharedusers、所屬業務物件的權限傳遞,能看這張表單才能拿它的附件。
每階段都是發現然後收斂,不是一步到位。授權收緊是有既有使用者的系統最難的變更,每收一步都可能弄壞某人的工作流程,分階段讓每一步的影響面可解釋、可回退。
storage_folder 分散目錄,單一目錄塞十萬個檔案後,檔案系統的列舉與備份效能雪崩,事後搬移目錄結構是大工程filename*=UTF-8''...),不處理的話中文檔名在不同瀏覽器各種亂碼儲存來源抽象化讓新舊檔案庫共用同一介面、外部唯讀;資料夾版本複用不可變模型;下載授權分階段收斂。明日 Day 26:批次匯入——三千筆料號怎麼優雅地進系統。